package org.bim.view.drag.design.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * 根据错误码获取错误信息的工具类
 * 文件目录放置在 i18n下的message.properties
 */
@Slf4j
public class ErrorCodeUtil {
    private static final String MESSAGE_LOCATION = "i18n/message";

    /**
     * 根据错误码获取错误信息
     *
     * @param errorCode 错误码
     * @param params    占位符，支持多个
     * @return 拼接好后的错误码
     */
    public static String getErrorMessage(int errorCode, String... params) {
        Locale locale = Locale.getDefault();
        return getErrorMessage(locale, errorCode, params);
    }

    /**
     * @param errorCode        错误码
     * @param defaultErrorCode 当errorCode未配置错误信息时，用备选的错误码来获取msg
     * @param params           msg模板中的参数
     * @return
     */
    public static String getErrorMessage(int errorCode, int defaultErrorCode, String... params) {
        String msg = ErrorCodeUtil.getErrorMessage(errorCode, params);
        if (StringUtils.isEmpty(msg)) {
            msg = ErrorCodeUtil.getErrorMessage(defaultErrorCode);
        }
        return msg;
    }

    /**
     * 根据错误码获取错误信息，支持传输语言
     *
     * @param language  语言，默认会是 中文，zh_CN、en_US
     * @param errorCode 错误码
     * @param params    占位符，支持多个
     * @return 拼接好后的错误码
     */
    public static String getErrorMessage(String language, int errorCode, String... params) {
        Locale locale = null;
        if (StringUtils.isEmpty(language)) {
            locale = new Locale("zh_CN");
        } else {
            locale = new Locale(language);
        }
        return getErrorMessage(locale, errorCode, params);
    }

    /**
     * 根据错误码获取错误信息，支持传输语言
     *
     * @param locale    当前环境
     * @param errorCode 错误码
     * @param params    占位符，支持多个
     * @return 拼接好后的错误码
     */
    public static String getErrorMessage(Locale locale, int errorCode, String... params) {
        ResourceBundle bundle = ResourceBundle.getBundle(MESSAGE_LOCATION, locale);
        String msg = null;
        try {
            msg = bundle.getString(String.valueOf(errorCode));
        } catch (MissingResourceException ex) {
            log.warn(ex.getMessage());
        }
        if (StringUtils.isEmpty(msg)) {
            return null;
        }
        MessageFormat messageFormat = new MessageFormat(msg);
        return messageFormat.format(params);
    }
}
